﻿// Inner Fire 游戏引擎库
// Prefab - 用于载入一个对象设定
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：框架层(5)
// 用于预置对象的设置。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-21

#pragma once

#include "static_string.h"
#include <dx/mesh/render_item.h>
#include <game/config/config_info.h>
#include <xml_reader.h>

namespace ifire::game {
class ConfigManager;

enum class PrefabType {
  Mesh = 0, // 一般的对象，一个Mesh
  SkinMesh, // 骨骼动画对象
  Camera,   // 摄像机
  Water,    // 水体（和天空盒一样需要特殊的Material处理）
  Map,      // 地图
  SkyBox    // 天空盒（这个放在最后面，因为要计算数量）
};

class Prefab : public ConfigInfo {

public:
  Prefab(ConfigManager* manager, const ikit::XmlNode& node);
  Prefab(const Prefab& lhs) = delete;
  Prefab& operator=(const Prefab& lhs) = delete;
  ~Prefab() = default;

public:
  // 对象的类型
  PrefabType type;
  // 对象的渲染层
  dx::RenderLayer render_layer;
  // 对象的位置
  IVec3 position;
  // 对象的旋转，使用欧拉角，度数，因为这是用XML配置，人类可以阅读
  IVec3 rotation;
  // 对象的旋转，四元数格式
  IVec4 rotation_quat;
  // 对象的缩放
  IVec3 scale;
  // Tiling
  XMFLOAT2 tiling;
  // 默认贴图
  ikit::sstr material;
  // 对象的模型
  ikit::sstr model;
  // 地图的名称
  ikit::sstr map_name;
  // 是否计算阴影
  bool is_cast_shadow;
};

using PrefabPtr = std::unique_ptr<Prefab>;

PrefabType ParsePrefabType(ikit::sstr text);

} // namespace ifire::game